/**
 * 定义应用全局参数和方法
 * 依赖jquery
 * @param appLoginName 用户登录名
 * @param appLoginNameUrl 获取登录名的url设置
 * @param appLoginUrl 登录url设置
 * @param appLogoutUrl 退出登录url设置
 * @param appUserDataUrl 获取用户信息的url设置
 * @param appResourceDataUrl 获取资源信息的url设置
 * @param appName 应用名称设置
 * @param appResourceRootName 资源名称设置
 * @param appDefaultAid 系统默认aid:权限系统应用id
 */
var _appConfigs = {
	appAjaxLoadFlag: '',
	appContext: {
		userData: {},
		resourceData: {},
		organizationData:{},
		groupsData:{},
		identityData:{},
		rolesData:{},
		applicationData:{},
		parameterData:{},
		dictData:{}
	},
	appChosedRoleId: '',
	appDefaultAid:'',
	appLoginName: '',
	appLoginNameUrl:'getUsernameService',
	appLoginUrl: 'login',
	appLogoutUrl: 'logout',
	appName: '',
	appNameSpace: '',
	appUserDataUrl: 'system/getAppUserDataService',
	appResourceDataUrl: 'system/getAppPermissionDataService',
	//appIdentityDataUrl:'pms/getAppIdentityDataService',
	//appParameterDataUrl:'pms/getAppParameterService',
	//appDictDataUrl:'pms/getAppDictDataService',
	appResourceRootId: '',
	appResourceRootName: '',
	appResourceData: {},
	appRoles: [],
	bindUserData: function(data) {	//	绑定用户信息
		if(data) {
			this.appContext.userData = data;
			this.appLoginName = data.loginName;
			if(data.roles) {	//	赋予角色
				for(var i=0; i<data.roles.length; i++) {
					this.appRoles.push(data.roles[i]);
				}
			}
		}
	},
	bindResourceData: function(data) {	//	绑定资源信息
		if(data) {
			this.appContext.resourceData = data;
		}
	},
	/*bindOrganizationData: function(data) {	//	绑定机构信息
		if(data) {
			this.appContext.organizationData = data;
		}
	},
	bindGroupsData: function(data) {	//	绑定群组信息
		if(data) {
			this.appContext.groupsData = data;
		}
	},
	bindIdentityData: function(data) {	//	绑定人员信息
		if(data) {
			this.appContext.identityData = data;
		}
	},*/
	bindRolesData: function(data) {	//	绑定角色信息
		if(data) {
			this.appContext.rolesData = data;
		}
	},
	/*bindApplicationData: function(data) {	//	绑定应用信息
		if(data) {
			this.appContext.applicationData = data;
		}
	},
	bindParameterData: function(data) {	//	绑定应用信息
		if(data) {
			this.appContext.parameterData = data;
		}
	},
	bindDictData: function(data) {	//	绑定应用信息
		if(data) {
			this.appContext.dictData = data;
		}
	},*/
	copyData: function(data) {  // 赋值数据
		var dataCopy;
		if(typeof data == "object") {
			if(data instanceof Array) {
				dataCopy = [];
				for(var i=0;i<data.length;i++){
					dataCopy.push(data[i]);
				}
			}else{
				dataCopy = data;
			}
			return dataCopy;
		}
	},
	getAppContext: function() {	//	获取应用上下文
		return this.appContext;
	},
	getUserData: function() {	//	获取用户数据
		return this.appContext.userData;
	},
	getResourceData: function() {	//	获取资源数据
		return this.appContext.resourceData;
	},
	getOrganizationData: function() {	//	获取用户数据
		return this.appContext.organizationData;
	},
	getGroupsData: function() {	//	获取资源数据
		return this.appContext.groupsData;
	},
	getIdentityData: function() {	//	获取用户数据
		return this.appContext.identityData;
	},
	getRolesData: function(data) {	//	绑定角色信息
		return this.appContext.rolesData;
	},
	getApplicationData: function(data) {	//	绑定角色信息
		return this.appContext.applicationData;
	},
	getParameterData: function(data) {	//	绑定角色信息
		return this.appContext.parameterData;
	},
	getDictData: function(data) {	//	绑定角色信息
		return this.appContext.dictData;
	},
	getRoles: function() {	//	获取角色信息
		return this.appRoles;
	},
	getPageContext: function(page) {	//	获取页面上下文
		if(this.pageContext) {
			return this.pageContext[page];
		} else {
			return null;
		}
	},
	removePageContext: function(params) {	//	移除页面上下文，未传参数则全部清空
		if(this.pageContext.params) {
			this.pageContext[params] = undefined;
		} else {
			this.pageContext = {};
		}
	},
	setPageContext: function(page, params) { //	page:页面标识; params:{} 传递参数
		this.pageContext = {};
		this.pageContext[page] = params;
	}
};

if(pms) {
	throw new Error('命名空间被注册，应用启动失败');
} else {
	var pms = {};
	pms.app = (function(){
		function start() {
			bindAppData();
			loadAppCache();
		}
		
		function stop() {  // 停止应用--退出登录
			sessionStorage.clear();
			window.onbeforeunload = null;
			$.post(_appConfigs.appLogoutUrl, function(data) {
            	if(data == 'success') {
            		location.href = _appConfigs.appLoginUrl;
            	}
            });
		}
		
		function bindAppData() {  //	绑定资源数据
			var iid,roleIds=[];
			$(document).data("appContext", {	//	初始化应用上下文
				appResourceData: {},
				appUserData: {},
				appRolesData:{},
			});
			$.ajax({
				url: _appConfigs.appLoginNameUrl,
				async: false,
				success: function(data) {
					_appConfigs.appLoginName = data;	//	获取登录用户名
				}
			});
			$.when($.ajax({   //获取应用上下文的用户信息
				url: _appConfigs.appUserDataUrl,
				type:'post',
				async:false,
				data: {
					username:_appConfigs.appLoginName,
					//aid:_appConfigs.appDefaultAid
				},
				success: function(data) {
					if(data.data) {
						_appConfigs.bindUserData(data.data.userData);	//	绑定用户数据
					//	_appConfigs.bindApplicationData(data.data.applicationdata);		//	绑定应用数据
						_appConfigs.bindRolesData(data.data.userRoleRefList);	//	绑定角色信息数据
						//iid = data.data.userdata.iid;
						var rolesData = data.data.userRoleRefList;
						for(var i=0;i<rolesData.length;i++){
							roleIds.push(rolesData[i].roleid);
						}
					}
				}
			})
			).then($.ajax({   //获取应用上下文的资源权限
					url: _appConfigs.appResourceDataUrl,
					type:'post',
					async:false,
					data:{aid:_appConfigs.appDefaultAid,roleids:roleIds},
					success: function(data) {
						if(data.data) {
							_appConfigs.bindResourceData(data.data);	//	绑定资源数据
						}
					}
				})
				/*iid==null?'':$.post(_appConfigs.appIdentityDataUrl,{iid : iid},function(data){	//	获取应用上下文的身份信息
					if(data.data) {
						_appConfigs.bindIdentityData(data.data.identityInfomationData);	//	绑定人员信息数据
						_appConfigs.bindOrganizationData(data.data.organizationData);	//	绑定机构信息
						_appConfigs.bindGroupsData(data.data.groupDataList);	//	绑定群组信息
					}
				}),
				$.post(_appConfigs.appParameterDataUrl,{aid:_appConfigs.appDefaultAid},function(data){
					if(data.data) {
						_appConfigs.bindParameterData(data.data);	//	绑定参数数据
					}
				}),
				$.post(_appConfigs.appDictDataUrl,{aid:_appConfigs.appDefaultAid,type:'1'},function(data){
					if(data.data) {
						_appConfigs.bindParameterData(data.data);	//	绑定参数数据
					}
				})*/
			);
		}
		
		function loadAppCache() {	//	加载应用缓存组件（获取字典表数据时）
			$.appCache = {};
			$.extend($.appCache, {
				map: {},
				push: function(key, value) {
					if(this.contain(key)) {
						throw new Error('键值已存在！');
					}else {
						$.appCache.map[key] = value;
					}
				},
				get: function(key) {
					return $.appCache.map[key];
				},
				remove: function(key) {
					delete($.appCache.map[key]);
				},
				clear: function() {
					$.appCache.map = {};
				},
				replace: function(key, value) {
					if(!this.contain(key)) {
						throw new Error('键值不存在！');
					}
				    $.appCache.map[key] = value;
				},
				contain: function(key) {
					return $.appCache.map[key] !== undefined;
				}
			});
		}
		
		function exportApplicationData() {
			var url = 'download/getApplicationDataFile';
			window.open(url, '文件下载');
		}
		
		return {
			start: start,
			stop: stop,
			exportApplicationData: exportApplicationData
		};
	})();
}

/**
 * 全局ajax完成事件处理器
 */
$(document).ajaxComplete(function(event, xhr, settings) {
	if(xhr.getResponseHeader('sessionstatus') == 'timeout') {	//	会话过期处理
		$.messager.confirm('操作提醒', '当前用户会话已过期，请重新登录', function (c) {
            if (c) {
                window.onbeforeunload = null;
                location.href = _appConfigs.appLoginUrl;
            }
		});
	}
	if(xhr.responseJSON) { //用于异步操作判断
		var jsonData = xhr.responseJSON;
		if(jsonData.success==false) {
			var message = jsonData.errorMsg==null?'操作错误':jsonData.errorMsg;
			$.messager.alert('消息',message);
		}
	}
});

/**
 * 全局ajax发送事件处理器
 */
$(document).ajaxSend(function(event, xhr, settings) {
	if(settings.url && settings.url.indexOf('?') != -1) {
		settings.url = settings.url.replace('?', '?' + Math.random() + '&');
	} else {
		settings.url += '?' + Math.random(); 
	}
});

/**
 * 加载css文件
 * 
 * @param href
 */
function loadCss(href) {
	$("<link>").attr({ rel: "stylesheet",
        type: "text/css",
        href: href
    }).appendTo("head");
}

/**
 * 加载js文件
 * @param url
 */
function loadScript(url, async, success) {
	$.ajax({
		url: url,
		dataType: "script",
		async: async == false?false:true,
		success: success
	});
}

/**
 * 根据指定url加载页面到指定元素
 * @param id
 * @param url
 * @param selector 在被加载的页面中选择加载的元素
 * @param callback 回调函数
 * @param asyncCallback	异步加载js回调函数
 * @param async默认为true即异步请求
 * 如果id存在则将返回页面内容加载到指定元素，否则返回页面内容
 */
function loadPage(opts) {
	var pageContent = '';
	if(!opts || opts.url == null || opts.url == "" || opts.url == undefined) {
		if(typeof opts.callback == 'function') {
			opts.callback.call(opts.callback, pageContent, 'fail');
		}
		return;
	}
	if(opts.id && $('#' + opts.id)) {
		$('#' + opts.id).empty();
	}
	$.get(opts.url, function(data, success) {
		data = $.parseHTML($.trim(data), true);
		var pageScriptUrlArray = [];	//	当前页面加载的JS文件URL地址数组
		for(var i=0; i<data.length; i++) {
			if(data[i].nodeName == "LINK") {
				loadCss(data[i].href);
			}else if(data[i].nodeName == "SCRIPT") {
				if(opts.async == false) {	//	同步加载js文件
					loadScript(data[i].src, false);
				} else {	//	异步加载js文件会默认在文档加载完毕以后
					pageScriptUrlArray.push(data[i].src);
				}
			}else if(data[i].className == opts.selector || data[i].id == opts.selector) {
				if(opts.id && $('#' + opts.id)) {
					$('#' + opts.id).append(data[i]);
				} else {
					pageContent += data[i].innerHTML;
				}
			}
		}
		if(typeof opts.callback == 'function') {
			opts.callback.call(opts.callback, pageContent, 'success');
		}
		if(opts.async != false) {	//	异步加载script则执行顺序为最后
			for(var i=0; i<pageScriptUrlArray.length; i++) {
				var loadedAll = false;
				if((i+1) == pageScriptUrlArray.length) {
					loadedAll = true;
				}
				loadScript(pageScriptUrlArray[i], true, function() {
					if(loadedAll == true && typeof opts.asyncCallback == 'function') {
						opts.asyncCallback.call(opts.asyncCallback);
					}
				});
			}
		}
	});
}

